//
//  CZComposeView.swift
//  微博
//
//  Created by 霸气的刘吉庆 on 16/4/25.
//  Copyright © 2016年 ios. All rights reserved.
//

import UIKit

//导入苹果的磨砂的框架
import pop


class CZComposeView: UIView {

    //创建一个按钮数组,放的是我们添加的数据等会便于取值
    lazy var menusButtons: [CZComposeMenuButton] = []
    
    //定义一个属性
    var menusTime: Double = 0
    
    //添加属性,记录我们的目标的控制器
    var targetVC: UIViewController?
    
    //提供给外界一个设置targetVC的方法,添加对应的view,在哪里调用,就在那里执行,这里实力化出来,等需要添加这个view的时候进行调用
    func show(targetVC: UIViewController?){
        
        targetVC?.view.addSubview(self)
        
        self.targetVC = targetVC
        
    }
    //定义一个属性用来保存模型
 
    lazy var array: [CZComposeMenuInfoModel] = {
        
        return self.itemInfo()
    }()
    
    //设置我们的加号按钮对应的view
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupUI()
        
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    private func setupUI(){
        
        
        frame = UIScreen.mainScreen().bounds
        //下面这个等同于上面这个代码
//        self.frame = UIScreen.mainScreen().bounds
        //首先设置背景,创建一个方法获取磨砂背景
        
        let image = getScreenImage().applyLightEffect()
        
//        let data = UIImagePNGRepresentation(image)
//        /Users/liujiqing/Desktop/未命名文件夹
//        data?.writeToFile("/Users/liujiqing/Desktop/哈哈.png", atomically: true)
        //创建一个ImageView做为view的背景
        let  imageVIew = UIImageView(image: image)
        
        addSubview(imageVIew)
     
        //设置界面
        
        addSubview(sloganImage)
        //设置约束
        sloganImage.snp_makeConstraints { (make) -> Void in
            make.centerX.equalTo(self)
            make.top.equalTo(100)
            
        }
        
        addButton()
        
    }
    
    private func getScreenImage()-> UIImage {
        
        //首先获取主界面
        let window = UIApplication.sharedApplication().keyWindow!
        
        let rect = window.frame
        
        //1.开启图形上下文
        //第三个参数代表的是图形渲染时候的缩放比,0代表是以该设备的真实大小截图,1代表以点的大小
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 1)
        
        //2.将屏幕的内容渲染到图形上下文中
        
        window.drawViewHierarchyInRect(rect, afterScreenUpdates: true)
        //获取图片那
        
        let image = UIGraphicsGetImageFromCurrentImageContext()
        
        //3.关闭图形上下文
        UIGraphicsEndImageContext()
        //设置这个view的背景图片
        
        return image
        
        
    }
    
    //点击了ComposeView
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
      
//        print("哈哈");
        //这里让他removeFromSuperView
        
        //让这些图标下去
        //遍历,这个需要什么呢,需要的是倒序
        
        
        for (index,value) in menusButtons.reverse().enumerate(){
            
            animation(value, index: index, isUp: false)
            
            
        }
        
         dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(0.4 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) { () -> Void in
            
           UIView.animateWithDuration(self.menusTime, animations: { () -> Void in
            
            self.alpha = 0.01
            
            }, completion: { (_) -> Void in
                
                 self.removeFromSuperview()
           })
            
        }
        
        
    }
    
    //里面的按钮从下面上来的动画,动画的添加一般在view显示出来,但didappear 是控制器的方法,这里我们调用的是didMoveToSUperView
    override func didMoveToSuperview() {
        //添加动画效果
        for (index,value) in menusButtons.enumerate(){
//            首先导入pop框架,这个是faceBook的框架
//            1.创建动画对象,这个是弹簧动画
//            这个枚举是怎么来的,点动画的属性,然后确定是view,因为layer的触摸时间还是停留在原地,其次,我们需要他的中心进行移动
            let anim = POPSpringAnimation(propertyNamed: kPOPViewCenter)
            //2.指定动画执行的结束位置
            anim.toValue = NSValue(CGPoint: CGPoint(x: value.center.x , y: value.center.y - 350))
            //3.设置动画的属性
            //代表弹簧速度, 最大为20
            anim.springSpeed = 10
            //弹力,最大20
            anim.springBounciness = 8
            
            //开始动画
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(Double(index)*0.025 * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), { () -> Void in
                
                value.pop_addAnimation(anim, forKey: nil)
    
            })
            
       
//            animation(value, index: index, isUp: true)
            
            
            
        }
        
        
    }
    //将动画的效果进行封装
    func animation(value: UIView,index: Int,isUp: Bool){
        
//       let anim = POPSpringAnimation(propertyNamed:kPOPViewCenter)
         let anim = POPSpringAnimation(propertyNamed: kPOPViewCenter)
        //设置动画的toValue
        //这里需要进行判断,直接三目运算符省去一些列的麻烦
//        if isUp{
//            
//            
//            
//            
//        }
//        anim.toValue = NSValue(CGPoint: CGPoint(x: value.center.x, y: value.center.y + (isUp ? -350 : 350)))
        
        anim.toValue = NSValue(CGPoint: CGPoint(x: value.center.x, y: value.center.y + (isUp ? -350 : 350)))
        //设置动画的属性
//        anim.springSpeed = 10
//        anim.springBounciness = 8
        anim.springSpeed = 10
        anim.springBounciness = 8
        
//        let animDuration = Double(index) * 0.025
//         dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(animDuration * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) { () -> Void in
//            
//            value.pop_addAnimation(anim, forKey: nil)
//            
//        }
    
        //可以不用上面的dispatch,直接设置它的开始时间,简单
//        anim.beginTime = Double(index) * 0.025 + CACurrentMediaTime()
//        
//        //添加动画
//        anim.pop_addAnimation(anim, forKey: nil)
        
        anim.beginTime = Double(index) * 0.025 + CACurrentMediaTime()
        menusTime = Double(index) * 0.025
        value.pop_addAnimation(anim, forKey: nil)
        
        
        
        
        
        
    }
    
    
    
    
    //创建一个添加按钮控件的功能
    private func addButton(){
        //添加按钮
        //计算每一个按钮之间的横向的间距
        let itemW: CGFloat = 80
        let itemH: CGFloat = 110
        let margin = (SCREENW - 3 * itemW )/4
        let array = itemInfo()
        //开始计算每一个cell的位置
        //上面取到数据了,遍历实例化按钮
        for (i,value) in array.enumerate() {
            
            //创建按钮
            let button = CZComposeMenuButton(textColor: UIColor.darkGrayColor(), fontSize: 14)
            
            button.setImage(UIImage(named: value.icon!), forState: .Normal)
            button.setTitle(value.title!, forState: .Normal)
            //为按钮添加单击时间
            button.addTarget(self, action: "menusButtonClick:", forControlEvents: UIControlEvents.TouchUpInside)
            
            button.tag = i
           
            //=直接算出来frame在进行计算
        //计算对应的行数和列数
            let col = i % 3
            let row = i / 3
            //计算x的值
            
            //重复实力化内存会暴增
            let itemX: CGFloat = CGFloat(col) * itemW + CGFloat(col + 1) * margin
            //2.计算y的值,注意这里需要加上一个屏幕的高度,这样才能让他显示在最上面,然后给他添加一个动画效果,让他从下面上来
            let itemY: CGFloat = CGFloat(row) * itemH + CGFloat(row) * 10 + SCREENH
            button.frame = CGRect(x: itemX, y: itemY, width: itemW, height: itemH)
            
            addSubview(button)
            //添加到数组中去
            menusButtons.append(button)
            
            
           
            
            
            
        }
        
        
        
        
    }
    //按钮的点击事件
    @objc private func menusButtonClick(button: UIButton){
    
        //点击的按钮直接作为参数传递过来,所以直接用就好了
        UIView.animateWithDuration(0.25, animations: { () -> Void in
            //遍历判断,是否是当前的按钮,是就放大,不是就缩小
            for value in self.menusButtons {
                
                //不管是不是当前的按钮都需要
                value.alpha = 0.1
                
                if value == button {
                    value.transform = CGAffineTransformMakeScale(2, 2)
                    
                }else{
                    value.transform = CGAffineTransformMakeScale(0.01, 0.01)
                    
                }
                
                
            }
            
            
            
            }) { (_) -> Void in
                
                //上面的动画完成之后,直接弹出新动画,直接弹出控制器
                
                //上面获取到了目标控制器,可以跳转到composeVC
                
                //这里有些问题,我们可以根据按钮的不同,跳转不同的控制器
                
                //取出model
                let model = self.array[button.tag]
                //取出里面的模型
                //还有就是查看类的名字是什么,直接答应装换出来的类
                
                print("\(model.className)")
//                let type = NSClassFromString(model.className!)! as! UIViewController.Type
                //测试代码 className 出来的是可选值,转换的时候也需要可选的转换
//                let className = NSClassFromString(model.className!)
                
             
                
                
                //答应控制器的名字
//                let className1 = NSStringFromClass(CZComposeVC.self)
//                print(className1)
//                let clazz = NSClassFromString(微博)
                
                
//                let composeVC = type.init()
                
//                let composeVC = CZComposeVC()
                
                
                
                let type = NSClassFromString(model.className!)! as! UIViewController.Type
                let composeVC = type.init()
                
                self.targetVC?.presentViewController(UINavigationController(rootViewController: composeVC), animated: true, completion: { () -> Void in
                    
                    self.removeFromSuperview()
                    
                    
                })
                
                
                
                
        }
        
        
        
        
    }
    
    
    
    //创建一个方法来获取对应的数据,这个数据我们根据plist固定来获取
    
    private func itemInfo()-> [CZComposeMenuInfoModel]{
        
        let path = NSBundle.mainBundle().pathForResource("compose.plist", ofType: nil)!
        let arr = NSArray(contentsOfFile: path)!
        
        //创建一个空的数组,定义一个空的数组,这样也可以
        var tempArray: [CZComposeMenuInfoModel] = []
        //遍历数组,进行模型的装换
        for value in arr {
            
            let model: CZComposeMenuInfoModel = CZComposeMenuInfoModel(dict: value as! [String : AnyObject])
            
            tempArray.append(model)
            
            
            
        }
        
        return tempArray
        
        
        
        
    }
    
    //设置标语
    private lazy var sloganImage = UIImageView(image: UIImage(named: "compose_slogan"))
    

}


